/*
 * HTML5 Sortable jQuery Plugin
 * http://farhadi.ir/projects/html5sortable
 * 
 * Copyright 2012, Ali Farhadi
 * Released under the MIT license.
 */
(function($) {
var dragging, placeholders = $();
$.fn.sortable = function(options) {
    options = options || {};
    return this.each(function() {
        if (/^enable|disable|destroy$/.test(options)) {
            var items = $(this).children($(this).data('items')).attr('draggable', options == 'enable');
            options == 'destroy' && items.add(this)
                .removeData('connectWith').removeData('items')
                .unbind('dragstart.h5s dragend.h5s selectstart.h5s dragover.h5s dragenter.h5s drop.h5s');
            return;
        }
        var index, items = $(this).children(options.items), connectWith = options.connectWith || false;
        var placeholder = $('<' + items[0].tagName + ' class="sortable-placeholder">');
        var handle = options.handle, isHandle;
        items.find(handle).mousedown(function() {
            isHandle = true;
        }).mouseup(function() {
            isHandle = false;
        });
        $(this).data('items', options.items)
        placeholders = placeholders.add(placeholder);
        if (connectWith) {
            $(connectWith).add(this).data('connectWith', connectWith);
        }
        items.attr('draggable', 'true').bind('dragstart.h5s', function(e) {
            if (handle && !isHandle) {
                return false;
            }
            isHandle = false;
            var dt = e.originalEvent.dataTransfer;
            dt.effectAllowed = 'move';
            dt.setData('Text', 'dummy');
            dragging = $(this).addClass('sortable-dragging');
            index = dragging.index();
        }).bind('dragend.h5s', function() {
            dragging.removeClass('sortable-dragging').fadeIn();
            placeholders.detach();
            if (index != dragging.index()) {
                items.parent().trigger('sortupdate');
            }
            dragging = null;
        }).not('a[href], img').bind('selectstart.h5s', function() {
            this.dragDrop && this.dragDrop();
            return false;
        }).end().add([this, placeholder]).bind('dragover.h5s dragenter.h5s drop.h5s', function(e) {
            if (!items.is(dragging) && connectWith !== $(dragging).parent().data('connectWith')) {
                return true;
            }
            if (e.type == 'drop') {
                e.stopPropagation();
                placeholders.filter(':visible').after(dragging);
                return false;
            }
            e.preventDefault();
            e.originalEvent.dataTransfer.dropEffect = 'move';
            if (items.is(this)) {
                dragging.hide();
                $(this)[placeholder.index() < $(this).index() ? 'after' : 'before'](placeholder);
                placeholders.not(placeholder).detach();
            }
            return false;
        });
    });
};
})(jQuery);